package com.ryskoo.framework.core.bean;

import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import java.io.Serializable;
import java.util.UUID;

/**
 * 
 * 当我们进行开发项目时，我们经常会用到实体映射到数据库表的操作，此时我们经常会发现在我们需要映射的几个实体类中，有几个共同的属性，例如编号ID，创建者，
 * 创建时间，修改者，修改时间，备注等。遇到这种情况，我们可能会想到把这些属性抽象出来当成一个父类，然后再以不同的实体类来继承这个父类。
 * 
 * 那么，我们便可以使用@MappedSuperclass注解，通过这个注解，我们可以将该实体类当成基类实体，它不会映射到数据库表，
 * 但继承它的子类实体在隐射时会自动扫描该基类实体的隐射属性，添加到子类实体的对应数据库表中。
 * 
 * 
 * 使用环境：<br>
 * 1.@MappedSuperclass注解使用在父类上面，是用来标识父类的
 * 2.@MappedSuperclass标识的类表示其不能映射到数据库表，因为其不是一个完整的实体类，但是它所拥有的属性能够隐射在其子类对用的数据库表中
 * 3.@MappedSuperclass标识得嘞不能再有@Entity或@Table注解
 * 
 * 
 * PO:persistant object ->持久层对象，对于数据库中表的基本字段
 */

@MappedSuperclass
public class BasicPO implements Serializable {

    /** 主键 */
	@Id
	@Column(name = "uuid", columnDefinition = "char(32)", length = 32, nullable = false)
	private String uuid;

	/** 业务流水号 */
	@Column(name = "entity_no", columnDefinition = "varchar(30)", length = 30)
	private String entityNo;

	/** 创建时间 */
	@Column(name = "create_time", columnDefinition = "char(19)", length = 19, nullable = false)
	private String createTime;

	/** 数据归属管理人员，后续可根据人员进行数据隔离 */
	@Column(name = "salesman_id", columnDefinition = "char(32)", length = 32)
	private String salesManId;

	/** 数据归属地区，后续可根据地区进行数据隔离 */
	@Column(name = "area_id", columnDefinition = "char(32)", length = 32)
	private String areaId;

	public String getUuid() {
		return uuid;
	}

	public void setUuid(String uuid) {
		this.uuid = uuid;
	}

	public String getCreateTime() {
		return createTime;
	}

	public void setCreateTime(String createTime) {
		this.createTime = createTime;
	}

	public String getEntityNo() {
		return entityNo;
	}

	public void setEntityNo(String entityNo) {
		this.entityNo = entityNo;
	}

	public String getSalesManId() {
		return salesManId;
	}

	public void setSalesManId(String salesManId) {
		this.salesManId = salesManId;
	}

	public String getAreaId() {
		return areaId;
	}

	public void setAreaId(String areaId) {
		this.areaId = areaId;
	}

	public static String genUuid() {
		String str = UUID.randomUUID().toString();
		return str.replaceAll("-", "");
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((uuid == null) ? 0 : uuid.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
            return true;
        }
		if (obj == null) {
            return false;
        }
		if (getClass() != obj.getClass()) {
            return false;
        }
		BasicPO other = (BasicPO) obj;
		if (uuid == null) {
            return other.uuid == null;
		} else {
            return uuid.equals(other.uuid);
        }
    }

	@Override
	public String toString() {
		return "BasicPO [uuid=" + uuid + ", entityNo=" + entityNo
				+ ", createTime=" + createTime + ", salesManId=" + salesManId
				+ ", areaId=" + areaId + "]";
	}
}
